﻿Данный способ должен подходить для любой Unix системы: Linux, FreeBSD, MacOS X
При написании этого руководства использовался Linux Mint 17.1 ( http://linuxmint.com/ )
1) Подготовка системы для кросскомпиляции.

 sudo apt-get install git bison cmake flex g++ gperf ruby scons libghc-zlib-dev  libghc-zlib-bindings-dev

2) Установка MXE и зависимостей
 cd /home/<ваше имя>/
 git clone https://github.com/mxe/mxe.git
 

2.1) gcc
 cd /home/<ваше имя>/mxe
 make gcc zlib

Проверка того, что установка gcc прошла успешно:
В папке /home/<ваше имя>/mxe/usr/bin должен появиться файл i686-w64-mingw32.static-gcc и i686-w64-mingw32.static-g++
И при запуске ./i686-w64-mingw32.static-gcc -v должно выдаваться
......
Thread model: win32
gcc version 4.9.2 (GCC)

В папке /home/<ваше имя>/mxe/usr/i686-w64-mingw32.static/lib должен быть файл:
libz.a

2.2) Openssl
 
 cd /home/<ваше имя>/mxe
 make openssl

Проверка что установка Openssl прошла успешно:
В папке /home/<ваше имя>/mxe/usr/i686-w64-mingw32.static/lib должны появиться два файла
-libssl.a
-libcrypto.a
В папке mxe/usr/i686-w64-mingw32.static/include должна появиться папка openssl

2.3) Boost

 cd /home/<ваше имя>/mxe
 make boost

Проверка что установка Boost прошла успешно:
В /home/<ваше имя>/mxe/usr/i686-w64-mingw32.static/lib папке должны появиться файлы:
-libboost_имябиблиотеки_mt.a (libboost_atomic-mt.a и другие подобные файлы)
-libboost_имябиблиотеки_mt-d.a (libboost_atomic-mt-d.a и другие подобные файлы)

В папке /home/<ваше имя>/mxe/usr/i686-w64-mingw32.static/include должна появиться папка boost

2.4) Berkeley DB
-Скачайте http://download.oracle.com/berkeley-db/db-6.0.20.tar.gz
-Распакуйте в домашнюю папку
-Откройте файл /home/<ваше имя>/db-6.0.20/src/dbinc/win_db.h
-Измените 
#include <WinIoCtl.h>
на
#include <winioctl.h>
-Сохраните файл
-Откройте терминал
 cd /home/<ваше имя>/db-6.0.20/build_unix
 export PATH=/home/<ваше имя>/mxe/usr/bin:$PATH
 ../dist/configure --host=i686-w64-mingw32.static --enable-mingw --enable-cxx --disable-shared --disable-replication
 make

Проверка, что установка Berkeley DB прошла успешно:
В папке /home/<ваше имя>/db-6.0.20/build_unix должны появиться файлы:
libdb.a
libdb_cxx.a

2.5) qrencode
-Скачайте http://download.sourceforge.net/libpng/libpng-1.6.15.tar.gz?download
-Распакуйте в домашнюю папку
-Откройте терминал

 export PATH=/home/<ваше имя>/mxe/usr/bin:$PATH
 cd /home/<ваше имя>/libpng-1.6.15
 ./configure --host=i686-w64-mingw32.static --disable-shared
 make
 cp .libs/libpng16.a .libs/libpng.a

Проверка что libpng собралась успешно:
в папке /home/<ваше имя>/libpng-1.6.15/.libs должен быть файл:
libpng.a

-Скачайте http://fukuchi.org/works/qrencode/qrencode-3.4.4.tar.gz
-Распакуйте в домашнюю папку
-Откройте терминал
 export PATH=/home/<ваше имя>/mxe/usr/bin:$PATH
 cd /home/<ваше имя>/qrencode-3.4.4

 LIBS="../libpng-1.6.15/.libs/libpng.a ../mxe/usr/i686-w64-mingw32.static/lib/libz.a" \
 png_CFLAGS="-I../libpng-1.6.15" \
 png_LIBS="-L../libpng-1.6.15/.libs" \
 ./configure --host=i686-w64-mingw32.static --enable-static --disable-shared --without-tools

 make

Проверка что qrencode успешно собралась:
в папке /home/<ваше имя>/qrencode-3.4.4/.libs должен быть файл:
libqrencode.a

2.6 Qt 5 и Qt 4

Qt 4
-Откройте терминал

 cd /home/<ваше имя>/mxe
 make qt

Проверка что Qt4 собрался правильно:
-Откройте терминал
-Введите следующие команды
 export PATH=/home/<ваше имя>/mxe/usr/bin:$PATH
 i686-w64-mingw32.static-qmake-qt4 -v

-Должно появиться в ответ
QMake version 2.01a
Using Qt version 4.8.6 in /home/<ваше имя>/mxe/usr/i686-w64-mingw32.static/qt/lib

Qt 5
-Откройте терминал

 export PATH=/home/<ваше имя>/mxe/usr/bin:$PATH
 cd /home/<ваше имя>/mxe
 make qtbase qttools qttranslations

Проверка что Qt5 собрался правильно:
-Откройте терминал
-Введите следующие команды
 export PATH=/home/<ваше имя>/mxe/usr/bin:$PATH
 i686-w64-mingw32.static-qmake-qt5 -v

-Должно появиться в ответ
QMake version 3.0
Using Qt version 5.4.0 in /home/<ваше имя>/mxe/usr/i686-w64-mingw32.static/qt5/lib

3. Компиляция

3.1 Скачиваем исходники
-Перейдите в домашнюю папку
-Откройте терминал

 git clone https://github.com/BioCoin-project/BioCoin.git

3.2 Собираем BioCoind 
-Откройте файл makefile.mingw в текстовом редакторе.(При написании инструкции использовался Pluma 1.8.1)
-Вставьте 
CC=$(CROSS)gcc
CXX=$(CROSS)g++
-Добавьте  строчку USE_ASM:=1
-Поменяйте текущие INCLUDEPATHS, LIBPATHS, LIBS на:

BOOST_SUFFIX?=-mt

INCLUDEPATHS= \
 -I"$(CURDIR)" \
 -I"/home/<ваше имя>/mxe/usr/i686-w64-mingw32.static/include" \
 -I"/home/<ваше имя>/" \
 -I"/home/<ваше имя>/db-6.0.20/build_unix" \
 
LIBPATHS= \
 -L"$(CURDIR)/leveldb" \
 -L"/home/<ваше имя>/mxe/usr/i686-w64-mingw32.static/lib" \
 -L"/home/<ваше имя>/db-6.0.20/build_unix" \

LIBS= \
  -l leveldb \
  -l memenv \
  -l boost_system$(BOOST_SUFFIX) \
  -l boost_filesystem$(BOOST_SUFFIX) \
  -l boost_program_options$(BOOST_SUFFIX) \
  -l boost_thread$(BOOST_SUFFIX) \
  -l boost_chrono$(BOOST_SUFFIX) \
  -l db_cxx \
  -l ssl \
  -l crypto \
  -l z
-Поменяйте LDFLAGS=-Wl,--dynamicbase -Wl,--nxcompat на 
LDFLAGS=-Wl,--dynamicbase -Wl,--nxcompat -Wl,--large-address-aware -static

-Поменяйте в последних строчках makefile.mingw
g++ -c $(CFLAGS) -o $@ $<
на
$(CXX) -c $(CFLAGS) -o $@ $<

g++ $(CFLAGS) $(LDFLAGS) -o $@ $(LIBPATHS) $^ $(LIBS)
на
$(CXX) $(CFLAGS) $(LDFLAGS) -o $@ $(LIBPATHS) $^ $(LIBS)

-Если вы хотите использовать LevelDB как базу блоков то измените:
USE_LEVELDB:=0 
на
USE_LEVELDB:=1
(выше USE_IPV6:=1)
Откройте файл /home/<ваше имя>/BioCoin/src/leveldb/Makefile
Вставьте ниже строчки CXXFLAGS += -I. -I./include $(PLATFORM_CXXFLAGS) $(OPT) следующие строки:

CC=$(CROSS)gcc
CXX=$(CROSS)g++
Сохраните файл

Снова возвращаемся в файл makefile.mingw, измените 
cd leveldb; make; cd ..
на 
cd leveldb; TARGET_OS=NATIVE_WINDOWS make CROSS=i686-w64-mingw32.static- libleveldb.a libmemenv.a; cd ..

Ещё измените
obj/txdb-leveldb.o: leveldb/libleveldb.lib
на
obj/txdb-leveldb.o: leveldb/libleveldb.a

Если вы хотите использовать BerkeleyDB как базу блоков, то просто удалите строчку USE_LEVELDB:=1

-Сохраните измененный файл makefile.mingw

-Откройте терминал
cd /home/<ваше имя>/BioCoin/src
export PATH=/home/<ваше имя>/mxe/usr/bin:$PATH
make CROSS=i686-w64-mingw32.static- -f makefile.mingw
strip BioCoind.exe


Во время линковки будут выдаваться подобные сообщения:
libboost_thread_win32-mt.a(thread.o): duplicate section `.rdata$_ZTVN5boost16exception_detail10clone_implINS0_19error_info_injectorINS_9gregorian9bad_monthEEEEE[__ZTVN5boost16exception_detail10clone_implINS0_19error_info_injectorINS_9gregorian9bad_monthEEEEE]' has different size
Игнорируйте их. На работоспособность программы это никак не влияет


3.3 Собираем BioCoin QT

Внимание: Если вы хотите собирать BioCoin Qt с LevelDB, но пропустили шаг со сборкой BioCoind.exe, то 
-Измените Makefile в папке leveldb также как в пункте 3.2
-Откройте терминал и выполните следующие команды:
export PATH=/home/<ваше имя>/mxe/usr/bin:$PATH
cd /home/<ваше имя>/BioCoin/src/leveldb
TARGET_OS=NATIVE_WINDOWS make CROSS=i686-w64-mingw32.static- libleveldb.a libmemenv.a;

-Откройте файл /home/<ваше имя>/BioCoin/BioCoin-qt.pro в текстовом редакторе(при написании инструкции использовался Pluma 1.8.1)
-Ниже 
# Dependency library locations can be customized with:
#    BOOST_INCLUDE_PATH, BOOST_LIB_PATH, BDB_INCLUDE_PATH,
#    BDB_LIB_PATH, OPENSSL_INCLUDE_PATH and OPENSSL_LIB_PATH respectively
замените прописанные пути к зависимостям на

BOOST_LIB_SUFFIX=-mt
BOOST_INCLUDE_PATH=/home/<ваше имя>/mxe/usr/i686-w64-mingw32.static/include
BOOST_LIB_PATH=/home/<ваше имя>/mxe/usr/i686-w64-mingw32.static/lib
BDB_INCLUDE_PATH=/home/<ваше имя>/db-6.0.20/build_unix
BDB_LIB_PATH=//home/<ваше имя>/db-6.0.20/build_unix
OPENSSL_INCLUDE_PATH=/home/<ваше имя>/mxe/usr/i686-w64-mingw32.static/include
OPENSSL_LIB_PATH=/home/<ваше имя>/mxe/usr/i686-w64-mingw32.static/lib
QRENCODE_INCLUDE_PATH=/home/<ваше имя>/qrencode-3.4.4
QRENCODE_LIB_PATH=/home/<ваше имя>/qrencode-3.4.4/.libs

Так же измените(если ещё не изменено) 
LIBS += -lshlwapi
genleveldb.commands = cd $$PWD/src/leveldb && CC=$$QMAKE_CC CXX=$$QMAKE_CXX TARGET_OS=OS_WINDOWS_CROSSCOMPILE $(MAKE) OPT=\"$$QMAKE_CXXFLAGS $$QMAKE_CXXFLAGS_RELEASE\" libleveldb.a libmemenv.a && $$QMAKE_RANLIB $$PWD/src/leveldb/libleveldb.a && $$QMAKE_RANLIB $$PWD/src/leveldb/libmemenv.a

на
 
LIBS += -lshlwapi
#genleveldb.commands = cd $$PWD/src/leveldb && CC=$$QMAKE_CC CXX=$$QMAKE_CXX TARGET_OS=OS_WINDOWS_CROSSCOMPILE $(MAKE) OPT=\"$$QMAKE_CXXFLAGS $$QMAKE_CXXFLAGS_RELEASE\" libleveldb.a libmemenv.a && $$QMAKE_RANLIB $$PWD/src/leveldb/libleveldb.a && $$QMAKE_RANLIB $$PWD/src/leveldb/libmemenv.a

Если в файле нет такой строчки CONFIG += static , то добавьте её.

Измените 
win32:QMAKE_LFLAGS........................
на 
win32:QMAKE_LFLAGS *= -Wl,--large-address-aware -static 

Измените 
win32:QMAKE_LRELEASE = $$[QT_INSTALL_BINS]\\lrelease.exe
на
win32:QMAKE_LRELEASE = $$[QT_INSTALL_BINS]/lrelease

Измените
LIBS += -lboost_system$$BOOST_LIB_SUFFIX -lboost_filesystem$$BOOST_LIB_SUFFIX -lboost_program_options$$BOOST_LIB_SUFFIX -lboost_thread$$BOOST_THREAD_LIB_SUFFIX
на
LIBS += -lboost_system$$BOOST_LIB_SUFFIX -lboost_filesystem$$BOOST_LIB_SUFFIX -lboost_program_options$$BOOST_LIB_SUFFIX -lboost_thread_win32$$BOOST_THREAD_LIB_SUFFIX

Измените
windows:LIBS += -lboost_chrono$$BOOST_LIB_SUFFIX -Wl,-Bstatic -lpthread -Wl,-Bdynamic
на
windows:LIBS += -lboost_chrono$$BOOST_LIB_SUFFIX

-Сохраните измененный файл BioCoin-qt.pro
-Откройте терминал и выполните следующие команды

Qt4 + транзакционный индекс LevelDB

export PATH=/home/<ваше имя>/mxe/usr/bin:$PATH
cd /home/<ваше имя>/BioCoin
i686-w64-mingw32.static-qmake-qt4 "USE_IPV6=1" "USE_LEVELDB=1" "USE_ASM=1" BioCoin-qt.pro
make -j n -f Makefile.Release  (вместо n количество ядер вашего процессора, которые вы хотите выделить под сборку)

Qt4 + транзакционный индекс BDB

export PATH=/home/<ваше имя>/mxe/usr/bin:$PATH
cd /home/<ваше имя>/BioCoin
i686-w64-mingw32.static-qmake-qt4 "USE_IPV6=1" "USE_ASM=1" BioCoin-qt.pro
make -j n -f Makefile.Release  (вместо n количество ядер вашего процессора, которые вы хотите выделить под сборку)

Qt5 + транзакционный индекс LevelDB

export PATH=/home/<ваше имя>/mxe/usr/bin:$PATH
cd /home/<ваше имя>/BioCoin
i686-w64-mingw32.static-qmake-qt5 "USE_IPV6=1" "USE_LEVELDB=1" "USE_ASM=1" BioCoin-qt.pro
make -j n -f Makefile.Release  (вместо n количество ядер вашего процессора, которые вы хотите выделить под сборку)

Qt5 + транзакционный индекс BDB

export PATH=/home/<ваше имя>/mxe/usr/bin:$PATH
cd /home/<ваше имя>/BioCoin
i686-w64-mingw32.static-qmake-qt5 "USE_IPV6=1" "USE_ASM=1" BioCoin-qt.pro
make -j n -f Makefile.Release  (вместо n количество ядер вашего процессора, которые вы хотите выделить под сборку)


Если всё сделано правильно, то файл BioCoin-qt.exe будет находится в папке /home/<ваше имя>/BioCoin/release
Во время линковки будут выдаваться подобные сообщения:
libboost_thread_win32-mt.a(thread.o): duplicate section `.rdata$_ZTVN5boost16exception_detail10clone_implINS0_19error_info_injectorINS_9gregorian9bad_monthEEEEE[__ZTVN5boost16exception_detail10clone_implINS0_19error_info_injectorINS_9gregorian9bad_monthEEEEE]' has different size
Игнорируйте их. На работоспособность программы это никак не влияет 

Если вы хотите уменьшить размер бинарных файлов, то
1) Перейдите на сайт http://upx.sourceforge.net/#downloadupx
2) Скачайте программу в соответсвии с вашей системой
3) Распакуйте программу в папку с бинарными BioCoin файлами.
4) Введите в терминале
./upx -9 BioCoind.exe
затем
./upx -9 BioCoin-qt.exe

И ваши BioCoind и BioCoin-qt станут меньше ~ в 3 раза.
